<?php

/**
 * Permet de faire la liaison entre un objet model user et sa persistance en bd 
 */
class ZendChat_Model_UserMapper {

    protected $_dbTable;

    /**
     * Fixe la db-table associé au user
     * @param type $dbTable
     * @return \ZendChat_Model_UserMapper
     * @throws Exception 
     */
    public function setDbTable($dbTable) {
        if (is_string($dbTable)) {
            $dbTable = new $dbTable();
        }
        if (!$dbTable instanceof Zend_Db_Table_Abstract) {
            throw new Exception('Invalid table data gateway provided');
        }
        $this->_dbTable = $dbTable;
        return $this;
    }

    /**
     * Retourne la db-table utilisé pour le persistance des users
     * @return ZendChat_Model_DbTable_User 
     */
    public function getDbTable() {
        if (null === $this->_dbTable) {
            $this->setDbTable('ZendChat_Model_DbTable_User');
        }
        return $this->_dbTable;
    }

    /**
     * Permet de sauvegarder un nouvel user ou de le mettre à jouur s'il existe
     * déjà en base de données
     * @param ZendChat_Model_User $user 
     */
    public function save(ZendChat_Model_User $user) {
        $data = array(
            'login' => $user->getLogin(),
            'pwd' => $user->getPwd()
        );

        if (($id = $user->getId()) === NULL) {
            $id = $this->getDbTable()->insert($data);
            $user->setId($id);
        } else {
            $this->getDbTable()->update($data, array('id = ?' => $id));
        }
    }

    /**
     * Permet de retrouver un user sauvegardé à partir de son login
     * @param type $login
     * @return le ZendChat_Model_User ou null si aucun utlisateur n'a éé trouvé 
     */
    public function findByLogin($login) {
        if (!is_string($login)) {
            return null;
        }

        $select = $this->getDbTable()->select();
        $select->where('login = ?', $login)->limit(1, 0);
        $row = $this->getDbTable()->fetchRow($select);
        return ($row === NULL) ? NULL : $this->rowToUser($row);
    }

    /**
     * Transforme une ligne de base de données en un user
     * @param type $row
     * @return ZendChat_Model_User 
     */
    private function rowToUser($row) {
        $user = new ZendChat_Model_User();
        $user->setId($row['id']);
        $user->setLogin($row['login']);
        $user->setPwd($row['pwd']);
        return $user;
    }

}

